package edu.neu.cloud_factory.controller;


import com.alibaba.fastjson.JSONObject;
import edu.neu.cloud_factory.entity.po.Order;
import edu.neu.cloud_factory.entity.po.Product;
import edu.neu.cloud_factory.entity.po.ProductType;
import edu.neu.cloud_factory.entity.vo.ProductTypeVo;
import edu.neu.cloud_factory.service.OrderService;
import edu.neu.cloud_factory.service.ProductService;
import edu.neu.cloud_factory.service.ProductTypeService;
import edu.neu.cloud_factory.utils.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * <p>
 * 产品类型 前端控制器
 * </p>
 *
 * @author halozhy
 * @since 2021-07-15
 */
@RestController
@RequestMapping("/api/prod_type")
public class ProductTypeController {
    @Autowired
    ProductTypeService productTypeService;

    @Autowired
    ProductService productService;

    @Autowired
    OrderService orderService;

    @GetMapping("/list_all")
    public List<ProductTypeVo> list() {
        List<ProductType> productTypeList = productTypeService.list();
        List<ProductTypeVo> productTypeVoList = new ArrayList<>();
        productTypeList.forEach(productType -> {
            ProductTypeVo productTypeVo = new ProductTypeVo();
            productTypeVo.setId(productType.getPtId());
            productTypeVo.setName(productType.getPtName());
            productTypeVoList.add(productTypeVo);
        });
        return productTypeVoList;
    }

    @PostMapping("/list")
    public JSONObject list(@RequestBody String CONTENT) {
        JSONObject j = JSONObject.parseObject(CONTENT);
        return productTypeService.listProdType(
                j.getInteger("page"),
                j.getInteger("limit"),
                j.getString("id"),
                j.getString("name")
        );
    }

    @PostMapping("/add")
    public int add(@RequestBody String CONTENT) {
        JSONObject j = JSONObject.parseObject(CONTENT);
        ProductType productType = new ProductType();
        if (!Utils.checkEmpty(j, Arrays.asList("name"))) {
            return -2; // 存在空字段
        }
        productType.setPtName(j.getString("name"));
        productTypeService.save(productType);
        return 0;
    }

    @PostMapping("/update")
    public int update(@RequestBody String CONTENT) {
        JSONObject j = JSONObject.parseObject(CONTENT);
        if (!Utils.checkEmpty(j, Arrays.asList("id", "name"))) {
            return -2; // 存在空字段
        }
        ProductType pt = productTypeService.getById(j.getInteger("id"));
        if (pt == null) {
            return -1; // 无此产品类型
        }
        pt.setPtName(j.getString("name"));
        productTypeService.updateById(pt);
        return 0;
    }

    @GetMapping("/delete")
    public int delete(int ptId) {
        // 当选中的产品类别有订单或者生产中已经关联的产品时不允许删除。
        // 当选中的产品类别有产品时，但是此产品并未进行过生产或下过订单，允许删除此类别，并且同时删除此产品。

        // 检查id所对应的产品类型是否存在
        ProductType pt = productTypeService.getById(ptId);
        if (pt == null) {
            // 无 return -2
            return -2;
        }
        List<Product> productList = productService.selectProductByProductTypeId(ptId);
        if (productList.size() == 0) {
            // 检查产品关联
            // 如果无，直接删除
            productTypeService.removeById(ptId);
            return 0;
        } else {
            // 如果有
            // 检查这些产品是否已经存在于订单中
            boolean flag = false;
            for (Product product : productList) {
                List<Order> orderList = orderService.selectOrderByProductId(product.getPId());
                if (orderList.size() != 0) {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                // 如果有，return -1
                return -1;
            } else {
                // 如果无，删除这些产品及其产品类型
                productList.forEach(product -> {
                    productService.removeById(product.getPId());
                });
                productTypeService.removeById(ptId);
                return 0;
            }

        }

    }
}

